package com.zxd.streams;

import java.util.*;
import java.util.stream.Collectors;

/**
 * ClassName:EndStream
 * Package:com.zxd.streams
 * 需要去重，要重写hashcode和equal方法
 * 流只能收集一次
 * @Date:2023/9/24 22:40
 * @Author:zxde
 */
public class EndStream {
    public static void main(String[] args) {
        List<StreamStudent> streamStudent = new ArrayList<>();
        StreamStudent s1 = new StreamStudent("蜘蛛精", 26, 172.5);
        StreamStudent s2 = new StreamStudent("蜘蛛精", 26,172.5);
        StreamStudent s3 = new StreamStudent("紫霞", 23,167.6);
        StreamStudent s4 = new StreamStudent("白晶晶", 25,169.0);
        StreamStudent s5 = new StreamStudent("牛魔王", 35,183.3);
        StreamStudent s6 = new StreamStudent("陈淼", 34,168.5);
        Collections.addAll(streamStudent, s1, s2, s3, s4, s5, s6);
        // 需求1: 请计算出身高超过168的学生有几人。
        System.out.println("-------身高超过168的学生有几人----------------------------------------------");

        long count = streamStudent.stream().filter(s -> s.getHeight() > 168)
                .count();
        System.out.println(count);
        System.out.println("---------请找出身高最高的学生对象，并输---------------------------------------------------");

        // 需求2: 请找出身高最高的学生对象，并输出。
        streamStudent.stream()
                .sorted((o1, o2) -> Double.compare(o2.getHeight(), o1.getHeight()))
                .limit(1)
                .forEach(System.out::println);

        System.out.println("--------请找出身高最高的学生对象，并输----------------------------------------------------");
        StreamStudent maxHeight = streamStudent.stream()
                .max(Comparator.comparingDouble(StreamStudent::getHeight))
                .get();
        System.out.println(maxHeight);

        System.out.println("--------请找出身高最矮的学生对象，并输出。--------------------------------------------------");
        StreamStudent minHeight = streamStudent.stream()
                .min(Comparator.comparingDouble(StreamStudent::getHeight))
                .get();
        System.out.println(minHeight);
        // 需求4: 请找出身高超过170的学生对象，并放到一个新集合中去返回。

        System.out.println("-------身高超过170的学生对象，并放到一个新集合中去返回-----------------------");
        List<StreamStudent> collectList = streamStudent.stream()
                .filter(s -> s.getHeight() > 170)
                .collect(Collectors.toList());
        collectList.forEach(System.out::println);

        System.out.println("-------身高超过170的学生对象，并放到一个新集合中去返回-----------------------");
        Set<StreamStudent> collectSet = streamStudent.stream()
                .filter(s -> s.getHeight() > 170)
                .collect(Collectors.toSet());
        collectSet.forEach(System.out::println);

        // 需求5: 请找出身高超过170的学生对象，并把学生对象的名字和身高，存入到一个Map集合返回
        System.out.println("----身高超过170的学生对象，并把学生对象的名字和身高，存入到一个Map集合返回--------");
        Map<String, StreamStudent> collectMap = streamStudent.stream()
                .filter(s -> s.getHeight() > 170)
                .distinct()
                .collect(Collectors.toMap(a -> a.getName(), a -> a));
        collectMap.forEach((k,v)-> System.out.println(k + " = "+v));


        System.out.println("----身高超过170的学生对象，并把学生对象的名字和身高，存入到一个数组返回--------");
        StreamStudent[] streamStudents = streamStudent.stream()
                .filter(s -> s.getHeight() > 170)
                .toArray(len -> new StreamStudent[len]);
        System.out.println(Arrays.toString(streamStudents));
    }
}
